package com.gxy.learn.design.model.create.singleton;

import java.io.Serializable;

/**
 * @description: 单例 懒汉式
 * 静态内部类单例模式中实例由内部类创建，由于VM在加载外部类的过程中，是不会加载静态内部类的，只有内部类的属性/方法被调用时才会被加载，并初始化其静态属性。
 * 静态属性由于被 static 修饰，保证只被实例化一次，并且严格保证实例化顺序。
 * @author: gaoxueyong
 * @Date: 2022/11/6 17:07
 */
public class  SingletonSluggardStaticSafeSerializable implements Serializable {
    private static boolean flag = false;
    private SingletonSluggardStaticSafeSerializable() {
        //        判断flag是否是true  true说明不是第一次访问，false代表第一次访问
        if(flag){
            throw new RuntimeException("不能创建多个对象！");
        }
        flag = true;
    }

    private static class SingletonHolder {
        private static final SingletonSluggardStaticSafeSerializable intance = new SingletonSluggardStaticSafeSerializable();
    }

    public static SingletonSluggardStaticSafeSerializable getInstance() {
        return SingletonHolder.intance;
    }

    /**
     * 当进行反序列化时会直接调用该方法 保证单例的完整性(单例进行序列化会破坏单例的完整性)
     *
     * @return java.lang.Object
     * @Author gaoxueyong
     * @Date 7:36 下午 2022/11/6
     * @Param []
     **/
    public Object readResolve() {
        return SingletonHolder.intance;
    }
}
